package czk.concrent.threadpool.canceltask;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 *
 * 取消线程池的定时任务
 *
 *
 * 使用scheduleAtFixedRate有以下几个情况必须注意：
 *
 * 任务逻辑中未捕获的异常能导致本该定时执行的任务，后续不再执行。
 * 任务逻辑中未捕获的异常不会外抛，外部感知不到。
 * 任务逻辑中的异常，需在任务逻辑内捕获并记录，否则无处可知。
 *
 *
 * @Author:ChenZhangKun
 * @Date: 2022/12/12 21:19
 */
public class CancelTaskDemo1 {
    public static void main(String[] args) throws InterruptedException {
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
        System.out.println(" start : " + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        ScheduledFuture<?> scheduledFuture = executorService.scheduleAtFixedRate(() -> {
            System.out.println("  work : " + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        }, 5, 5, TimeUnit.SECONDS);

        TimeUnit.SECONDS.sleep(15);
        // 从父类cancel方法的注释中可以寻找到答案，如果是 true 的话，即代表尝试通过中断的方式来停止任务
        scheduledFuture.cancel(true);
        System.out.println("cancel : " + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        TimeUnit.SECONDS.sleep(30);

    }
}
